package coder

import (
	"context"
	"github.com/nats-io/nats.go"
	"github.com/nats-io/nats.go/micro"
)

// DecodeNatsMicroRequestFunc extracts a user-domain request object from a publisher
// request object. It's designed to be used in NATS subscribers, for subscriber-side
// endpoints. One straightforward DecodeNatsMicroRequestFunc could be something that
// JSON decodes from the request body to the concrete response type.
type DecodeNatsMicroRequestFunc func(context.Context, micro.Request) (request interface{}, err error)

// EncodeNatsMicroRequestFunc encodes the passed request object into the NATS request
// object. It's designed to be used in NATS publishers, for publisher-side
// endpoints. One straightforward EncodeNatsMicroRequestFunc could something that JSON
// encodes the object directly to the request payload.
type EncodeNatsMicroRequestFunc func(context.Context, micro.Request, interface{}) error

// EncodeNatsMicroResponseFunc encodes the passed response object to the subscriber reply.
// It's designed to be used in NATS subscribers, for subscriber-side
// endpoints. One straightforward EncodeNatsMicroResponseFunc could be something that
// JSON encodes the object directly to the response body.
type EncodeNatsMicroResponseFunc func(context.Context, string, *nats.Conn, interface{}) error

// DecodeNatsMicroResponseFunc extracts a user-domain response object from an NATS
// response object. It's designed to be used in NATS publisher, for publisher-side
// endpoints. One straightforward DecodeNatsMicroResponseFunc could be something that
// JSON decodes from the response payload to the concrete response type.
type DecodeNatsMicroResponseFunc func(context.Context, micro.Request) (response interface{}, err error)

// EncodeJSONToNatsMicroRequest is an EncodeNatsMicroRequestFunc that serializes the request as a
// JSON object to the Data of the Msg. Many JSON-over-NATS services can use it as
// a sensible default.
func EncodeJSONToNatsMicroRequest(_ context.Context, msg micro.Request, request interface{}) error {
	//b, err := json.Marshal(request)
	//if err != nil {
	//	return err
	//}
	//msg.Data = b

	return nil
}
